package serova.valeriya.electricity;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class PowerBillApp {		
	private static final Logger LOGGER = Logger.getLogger(PowerBillApp.class);	
	private static final UserInterface userInterface = new UserInterface();
	
	
//	private static List <String> fileContent = new ArrayList <String>();
	public static void main(String[] args)  throws IOException, ParseException  {	

		init();
		ModeFactory modeFactory = ModeFactory.getCurrentInstance();
		try {
			List<ApplicationMode> availableModes = modeFactory.getAvailableModes();
			ApplicationMode currentMode = getMode(availableModes);
			modeFactory.getWorker(currentMode).run();
		} catch (IllegalStateException e) {
			userInterface.printError(ErrorConsts.NO_MODES_AVAILABLE);
			LOGGER.error(ErrorConsts.NO_MODES_AVAILABLE);
			System.exit(0);
		}
		
		
		/*
		try {			
			if ((new File(config.getRegistrationDataPath())).exists()) {				
				InputStreamReader stream = TariffDataSource.getInputStreamReader(config.getRegistrationDataPath());
				fileContent = TariffDataSource.getFileInformation(stream);					
				String bill = fileContent.get(fileContent.size()-1);
				System.out.println(bill);
				String[] array = AnalysisTariffData.getDataArray(bill);
				input.setPreviousRegistration(getPreviousRegistration(array));
				input.setCategory(getCategoryFromFile(fileContent));				
			} else {
				UserDialog.printReport(UserDialog.getAboutProgram());
				UserDialog.printReport(UserDialog.getChooseCategory());				
				input.setCategory(UserDialog.getString());
				UserDialog.printReport(UserDialog.getPreviousRegistrationRequest());				
				input.setPreviousRegistration(UserDialog.getInteger());
				PrintWriter object = getPrintWriter(config.getRegistrationDataPath());				
				writeToFileTheFirstLaunchingData(input, object);
			}			
			
			   boolean isStatisticMode = false;
			   if(fileContent.size() >= 4) {
			        isStatisticMode = UserDialog.getMode(UserDialog.getChooseStatisticOrReport());
			   }
			  
			   if (isStatisticMode){
				   Result.makeStatistic();         
			   } else {
				   Result.makeReport(); 
			   }
		} catch (InputMismatchException e) {
			LOGGER.error("Неверный формат данных. Пожалуйста, введите целое число", e);
			  UserDialog.printErrorMessage("Неверный формат данных. Пожалуйста, введите целое число.");
		}
		catch (FileNotFoundException e) {
			LOGGER.error("Файл не найден");
			  UserDialog.printErrorMessage("Проблема при работе с файлом: файл не найден" + e + "n/Обратитесь к администратору");
		}
		System.exit(0);*/
		
	}	
	
	
	
	private static void init() {
		DOMConfigurator.configure(Configuration.getCurrentInstance().getLogPath());
	}



	private static ApplicationMode getMode(List <ApplicationMode> availableModes) {
		if (availableModes.size() == 1) {
			return availableModes.get(0);
		}
		return userInterface.getMode(availableModes);
	}



//	public void run(){
//		initialise(readConfiguration());
//		if(!(new File(config.getRegistrationDataPath())).exists()){
//			UserDialog.printReport(UserDialog.getAboutProgram());
//			UserDialog.printReport(UserDialog.getChooseCategory());				
//			input.setCategory(UserDialog.getString());
//			UserDialog.printReport(UserDialog.getPreviousRegistrationRequest());				
//			input.setPreviousRegistration(UserDialog.getInteger());
//			PrintWriter object = getPrintWriter(config.getRegistrationDataPath());				
//			writeToFileTheFirstLaunchingData(input, object);	
//			start(DEFAULT_MODE);
//		} else {
//			start(promptMode());
//		}
//	}
//		
//		
//		
//		
//	}
//		
//
	public static Input getInput() {
//		return input;
		return null;
	}

	public static List<String> getFileContent() {
		//return fileContent;
		return null;
	}

	public static BufferedWriter getBufferedWriter(String fileName) {
		BufferedWriter buffered = null;
		try {
			FileWriter writer = new FileWriter(fileName, true);
			buffered = new BufferedWriter(writer);
		} catch (IOException e) {
			Configuration config = Configuration.getCurrentInstance();
			LOGGER.error("Проблема при работе с файлом"
							+ config.getRegistrationDataPath(), e);
			UserDialog.printErrorMessage("Проблема при работе с файлом"
					+ config.getRegistrationDataPath() + e
					+ "n/Обратитесь к администратору");

		}
		return buffered;
	}
//
	
	public static void writeToFile(BufferedWriter buffered, String data) throws 
	 IOException{		
	buffered.write(data);
	buffered.newLine();
		buffered.flush();			
	}	

	public	static double calculatePayment(Input input) {		 
		InputStreamReader stream = TariffDataSource.getInputStreamReaderURL(Configuration.getCurrentInstance().getTarificationDataPath());
		List <String> fileContent = TariffDataSource.getFileInformation(stream);
		double electricityPrice = AnalysisTariffData.getTarif(input.getCategory(), input.calculateElectricity(), fileContent);
	double payment = input.calculateElectricity() * electricityPrice;		
		return payment;
	}

	public	static String getDate(){
		Date d = new Date(System.currentTimeMillis());
	    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");	    
	    return df.format(d).toString();
	}
	
}

